use std::process::Command;
use std::str::from_utf8;

// 模拟execute_as_user函数的测试
fn test_execute_as_user() {
    // 注意：这个测试只能在Linux上运行
    if !cfg!(target_os = "linux") {
        println!("跳过测试：此测试只能在Linux系统上运行");
        return;
    }

    // 测试参数
    let target_user = "testuser"; // 请确保这个用户存在
    let script = "echo $HOME && echo $PATH && whoami";

    // 模拟执行命令
    let command = format!(
        r#"
        cd ~{}
        source ~/.bashrc 2>/dev/null || true
        source ~/.profile 2>/dev/null || true
        source /etc/profile 2>/dev/null || true
        {}
        "#,
        target_user,
        script
    );

    // 执行命令
    let output = Command::new("su")
        .arg(target_user)
        .arg("-c")
        .arg(format!("/bin/bash -c '{}'", escape_bash(&command)))
        .output()
        .expect("执行命令失败");

    // 检查输出
    let stdout = from_utf8(&output.stdout).unwrap();
    let stderr = from_utf8(&output.stderr).unwrap();

    println!("=== 测试结果 ===");
    println!("退出状态: {}", output.status);
    println!("标准输出:
{}", stdout);
    println!("标准错误:
{}", stderr);

    // 验证结果
    assert!(output.status.success());
    assert!(stdout.contains(&format!("/home/{}", target_user)));
    assert!(stdout.contains(target_user));

    println!("测试通过！");
}

// 转义bash命令中的特殊字符
fn escape_bash(s: &str) -> String {
    s.replace("'", "'\\''")
}

fn main() {
    println!("开始模拟测试...");
    test_execute_as_user();
    println!("模拟测试完成。");
}